home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 March / CMCD0305.ISO / Software / Shareware / Utilitare / emu / Emu8086_Setup_307c.exe / {app} / Samples / micro-os_kernel.asm < prev    next >
Assembly Source File  |  2002-08-08  |  6KB  |  299 lines

  1. ; This is a very basic example
  2. ; of a tiny operating system.
  3. ;
  4. ; This is Kernel module!
  5. ;
  6. ; It is assumed that this machine
  7. ; code is loaded by 'micro-os_loader.asm'
  8. ; from floppy drive from:
  9. ;   cylinder: 0
  10. ;   sector: 2
  11. ;   head: 0
  12.  
  13. ; Directive to create BIN file:
  14. #make_BIN#
  15.  
  16. ; where to load (for emulator)?
  17. #LOAD_SEGMENT=0800#
  18. #LOAD_OFFSET=0000#
  19.  
  20. ; set these values to registers on load,
  21. ; actually only DS, ES, CS, IP, SS, SP are
  22. ; important. In real world these values
  23. ; are left by "micro-os_loader":
  24. #AL=0B#
  25. #AH=00#
  26. #BH=00#
  27. #BL=00#
  28. #CH=00#
  29. #CL=02#
  30. #DH=00#
  31. #DL=00#
  32. #DS=0800#
  33. #ES=0800#
  34. #SI=7C02#
  35. #DI=0000#
  36. #BP=0000#
  37. #CS=0800#
  38. #IP=0000#
  39. #SS=07C0#
  40. #SP=03FE#
  41.  
  42.  
  43.  
  44. include 'emu8086.inc'
  45.  
  46. ; Kernel is loaded at 0800:0000
  47. ORG 0000h
  48.  
  49. ; skip the data section:
  50. JMP start
  51.  
  52. ;==== data section =====================
  53.  
  54. ; welcome message:
  55. msg  DB 'Welcome to micro-os!', 13, 10,
  56.      DB 'type help if you need it', 0 
  57.  
  58. cmd_size        EQU 10    ; size of command_buffer
  59. command_buffer  DB cmd_size DUP('x')
  60. clean_str       DB cmd_size DUP(' '), 0
  61. prompt          DB '>', 0
  62.  
  63. ; commands:
  64. cHELP    DB 'help', 0
  65. cCLS     DB 'cls', 0
  66. cQUIT    DB 'quit', 0
  67. cEXIT    DB 'exit', 0
  68. cREBOOT  DB 'reboot', 0
  69.  
  70. help_msg DB 'Thank you for using micro-os!', 13, 10
  71.          DB 'List of supported commands:', 13, 10
  72.          DB 'help   - print out this list.', 13, 10
  73.          DB 'cls    - clear the screen.', 13, 10
  74.          DB 'reboot - reboot the machine.', 13, 10
  75.          DB 'quit   - same as reboot.', 13, 10  
  76.          DB 'exit   - same as reboot.', 13, 10
  77.          DB 'more to come!', 13, 10, 0
  78.  
  79. unknown  DB 'Unknown command: ' , 0
  80.  
  81. ;======================================
  82.  
  83. start:
  84.  
  85. ; set data segment:
  86. PUSH    CS
  87. POP     DS
  88.  
  89. ; set default video mode 80x25:
  90. MOV     AH, 00h
  91. MOV     AL, 03h
  92. INT     10h
  93.  
  94. ; clear screen:
  95. CALL    clear_screen
  96.  
  97. ; print out the message:
  98. LEA     SI, msg
  99. CALL    print_string
  100.  
  101.  
  102. eternal_loop:
  103.  
  104. CALL    GET_COMMAND
  105.  
  106. CALL    PROCESS_CMD
  107.  
  108. ; make eternal loop:
  109. JMP eternal_loop
  110.  
  111.  
  112. ;===========================================
  113. GET_COMMAND PROC NEAR
  114.  
  115. ; set cursor position to bottom
  116. ; of the screen:
  117. MOV     AX, 40h
  118. MOV     ES, AX
  119. MOV     AL, ES:[84h]
  120.  
  121. GOTOXY  0, AL
  122.  
  123. ; clear command line:
  124. LEA     SI, clean_str
  125. CALL    print_string
  126.  
  127. GOTOXY  0, AL
  128.  
  129. ; show prompt:
  130. LEA     SI, prompt 
  131. CALL    print_string
  132.  
  133.  
  134. ; wait for a command:
  135. MOV     DX, cmd_size    ; buffer size.
  136. LEA     DI, command_buffer
  137. CALL    get_string
  138.  
  139.  
  140. RET
  141. GET_COMMAND ENDP
  142. ;===========================================
  143.  
  144. PROCESS_CMD PROC    NEAR
  145.  
  146. ;//// check commands here ///
  147. ; set ES to DS
  148. PUSH    DS
  149. POP     ES
  150.  
  151. CLD     ; forward compare.
  152.  
  153. ; compare command buffer with 'help'
  154. LEA     SI, command_buffer
  155. MOV     CX, 5   ; size of ['help',0] string.
  156. LEA     DI, cHELP
  157. REPE    CMPSB
  158. JE      help_command
  159.  
  160. ; compare command buffer with 'cls'
  161. LEA     SI, command_buffer
  162. MOV     CX, 4   ; size of ['cls',0] string.
  163. LEA     DI, cCLS
  164. REPE    CMPSB
  165. JNE     not_cls
  166. JMP     cls_command
  167. not_cls:
  168.  
  169. ; compare command buffer with 'quit'
  170. LEA     SI, command_buffer
  171. MOV     CX, 5   ; size of ['quit',0] string.
  172. LEA     DI, cQUIT
  173. REPE    CMPSB
  174. JE      reboot_command
  175.  
  176. ; compare command buffer with 'exit'
  177. LEA     SI, command_buffer
  178. MOV     CX, 5   ; size of ['exit',0] string.
  179. LEA     DI, cEXIT
  180. REPE    CMPSB
  181. JE      reboot_command
  182.  
  183. ; compare command buffer with 'reboot'
  184. LEA     SI, command_buffer
  185. MOV     CX, 7   ; size of ['reboot',0] string.
  186. LEA     DI, cREBOOT
  187. REPE    CMPSB
  188. JE      reboot_command
  189.  
  190. ;////////////////////////////
  191.  
  192. ; if gets here, then command is
  193. ; unknown...
  194.  
  195. MOV     AL, 1
  196. CALL    SCROLL_T_AREA
  197.  
  198. ; set cursor position just
  199. ; above prompt line:
  200. MOV     AX, 40h
  201. MOV     ES, AX
  202. MOV     AL, ES:[84h]
  203. DEC     AL
  204. GOTOXY  0, AL
  205.  
  206. LEA     SI, unknown
  207. CALL    print_string
  208.  
  209. LEA     SI, command_buffer
  210. CALL    print_string
  211.  
  212. MOV     AL, 1
  213. CALL    SCROLL_T_AREA
  214.  
  215. JMP     processed
  216.  
  217. ; +++++ 'help' COMMAND ++++++
  218. help_command:
  219.  
  220. ; scroll text area 9 lines up:
  221. MOV     AL, 9
  222. CALL    SCROLL_T_AREA
  223.  
  224. ; set cursor position 9 lines
  225. ; above prompt line:
  226. MOV     AX, 40h
  227. MOV     ES, AX
  228. MOV     AL, ES:[84h]
  229. SUB     AL, 9
  230. GOTOXY  0, AL
  231.  
  232. LEA     SI, help_msg
  233. CALL    print_string
  234.  
  235. MOV     AL, 1
  236. CALL    SCROLL_T_AREA
  237.  
  238. JMP     processed
  239.  
  240.  
  241. ; +++++ 'cls' COMMAND ++++++
  242. cls_command:
  243.  
  244. ; clear screen:
  245. CALL    clear_screen
  246.  
  247. JMP     processed
  248.  
  249.  
  250. ; +++ 'quit', 'exit', 'reboot' +++
  251. reboot_command:
  252.  
  253. ; store magic value at 0040h:0072h:
  254. ;   0000h - cold boot.
  255. ;   1234h - warm boot.
  256. MOV     AX, 0040h
  257. MOV     DS, AX
  258. MOV     w.[0072h], 0000h ; cold boot.
  259.  
  260. JMP    0FFFFh:0000h     ; reboot!
  261.  
  262. ; ++++++++++++++++++++++++++
  263.  
  264. processed:
  265. RET
  266. PROCESS_CMD ENDP
  267.  
  268. ;===========================================
  269.  
  270. ; scroll all screen except last row
  271. ; up by value specified in AL
  272.  
  273. SCROLL_T_AREA   PROC    NEAR
  274.  
  275. MOV DX, 40h
  276. MOV ES, DX  ; for getting screen parameters.
  277. MOV AH, 06h ; scroll up function id.
  278. MOV BH, 07  ; attribute for new lines.
  279. MOV CH, 0   ; upper row.
  280. MOV CL, 0   ; upper col.
  281. MOV DI, 84h ; rows on screen -1,
  282. MOV DH, ES:[DI] ; lower row (byte).
  283. DEC DH  ; don't scroll bottom line.
  284. MOV DI, 4Ah ; columns on screen,
  285. MOV DL, ES:[DI]
  286. DEC DL  ; lower col.
  287. INT 10h
  288.  
  289. RET
  290. SCROLL_T_AREA   ENDP
  291.  
  292. ;===========================================
  293.  
  294. DEFINE_PRINT_STRING
  295. DEFINE_GET_STRING
  296. DEFINE_CLEAR_SCREEN
  297.  
  298. END
  299.